<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型继承+构造函数</title>
</head>
<body>
    <script>
        // 通过调用父类的构造，继承父类的属性，保留传参的优点。然后通过子类的原型等于父类的实例，实现函数复用。
// function Parent (name){
//     this.name = name
//     this.colors = ["red","yellow","plum"]
// }
// Parent.prototype.getName = function (){
//     console.log(this.name)
// }

// function Child(name,age){
//     Parent.call(this,name)
//     this.age = age
// }
// Child.prototype = new Parent()
// Child.prototype.constructor = Child

// let child1 = new Child("举案齐眉",18)
// let child2 = new Child("花好月圆",20)
// child1.colors.push("orange")
// console.log(child1.colors,child1.name,child1.age)
// console.log(child2.colors,child2.name,child2.age)
// ——————————————————————————————————————————————————————————————————————————————————————————
function Person(name,age){
    this.name = name
    this.age = age

}
Person.prototype.setAge = function(){
    console.log(1111)
}
function Student(name,age,price){
    Person.call(this,name,age)
    this.price = price
    this.setScore = function (){

    }
}
Student.prototype = new Person()
Student.prototype.constructor = Student//修复构造函数指向
Student.prototype.sayHello = function(){}
let s1 = new Student("花好月圆",25,24000)
let s2 = new Student("举案齐眉",26,26000)

console.log(s1.setAge())



// 优点：
// 融合原型链继承和构造函数的优点，是js中最常见的继承
// 1. 可以继承实例的属性和方法，也可以继承原型的属性和方法
// 2，不存在引用类型的属性所有实例共享的问题
// 3，可以像父类传参
// 4，函数可复用
// 缺点：
// 调用两次构造函数：一次在创建子类原型的时候，另一次是子类型创建实例的时候，
// 子类型最终会包含父类型对象的全部实例属性和方法，但我们不得不在调用子类构造函数时重写这些属性
// 调用了两次父类的构造函数，生成了两份实例





    </script>
</body>
</html>